import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;

/**
 * Панель для поиска. Может запрашивать у базы название и id различных
 * сущностей, по введенному в текстовое поле значению. Тип запроса выбирается
 * в выпадающем списке. Результаты запроса отображаются в таблицы, кликнув по
 * строке в которой можно получить информацию об элементе
 * @author tub
 */
public class SearchPanel extends JPanel
{
    public SearchPanel(MusicEntity[] ent, ExplorePanel explorer)
    {
        this.explorer = explorer;

        //Инициализация элемнтов-контроллеров
        searchField = new JTextField("Введите запрос", 20);
        request = new JButton("Search");
        typeBox = new JComboBox();

        //Добавление к выпадающему списку объектов сущностей
        for (int i = 0; i < ent.length; i++)
            typeBox.addItem(ent[i]);

        //Инициализация модели таблицы (с установкой запроса по умолчанию)
        //и создание таблицы
        model = new SearchTableModel(null);
        search();       //Тут инициализируется поле currentType
        result = new JTable(model);
        result.setAutoCreateRowSorter(true);        //Включение режима сортировки
        result.removeColumn(result.getColumnModel().getColumn(0));      //Скрытие столбца ID
        result.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        result.setFillsViewportHeight(true);

        //Назначение слушателя кнопки
        request.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseReleased(MouseEvent e)
            {
                search();
            }
        });
        
        result.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseReleased(MouseEvent e)
            {
                if (e.getClickCount() == 2)
                {
                    createTab();
                }
            }
        });

        JButton allLabels = new JButton("All Labels");
        allLabels.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseReleased(MouseEvent e)
            {
                SearchAllLabels();
            }
        });

        GridBagLayout layout = new GridBagLayout();
        GridBagConstraints reqConstr = new GridBagConstraints();
        reqConstr.weightx = 100;
        reqConstr.weighty = 100;
        reqConstr.gridx = 0;
        reqConstr.gridy = 2;
        reqConstr.gridheight = 1;
        reqConstr.gridwidth = 1;
        reqConstr.anchor = GridBagConstraints.WEST;
        reqConstr.insets = new Insets(0, 10, 5, 0);

        GridBagConstraints labelConstr = new GridBagConstraints();
        labelConstr.weightx = 100;
        labelConstr.weighty = 100;
        labelConstr.gridx = 1;
        labelConstr.gridy = 2;
        labelConstr.gridheight = 1;
        labelConstr.gridwidth = 1;
        labelConstr.anchor = GridBagConstraints.WEST;
        labelConstr.insets = new Insets(0, 10, 5, 0);

        GridBagConstraints searchConstr = new GridBagConstraints();
        searchConstr.weightx = 100;
        searchConstr.weighty = 100;
        searchConstr.gridx = 0;
        searchConstr.gridy = 1;
        searchConstr.gridheight = 1;
        searchConstr.gridwidth = 2;
        searchConstr.fill = GridBagConstraints.HORIZONTAL;
        searchConstr.insets = new Insets(0, 10, 5, 10);

        GridBagConstraints typeConstr = new GridBagConstraints();
        typeConstr.weightx = 100;
        typeConstr.weighty = 100;
        typeConstr.gridx = 0;
        typeConstr.gridy = 0;
        typeConstr.gridheight = 1;
        typeConstr.gridwidth = 1;
        typeConstr.anchor = GridBagConstraints.WEST;
        typeConstr.insets = new Insets(5, 10, 5, 0);
        typeConstr.fill = GridBagConstraints.HORIZONTAL;

        GridBagConstraints resultConstr = new GridBagConstraints();
        resultConstr.weightx = 100;
        resultConstr.weighty = 100;
        resultConstr.gridx = 0;
        resultConstr.gridy = 3;
        resultConstr.gridheight = 10;
        resultConstr.gridwidth = 2;
        resultConstr.fill = GridBagConstraints.HORIZONTAL;
        resultConstr.insets = new Insets(0, 10, 5, 10);


        setLayout(layout);
        add(request, reqConstr);
        add(allLabels, labelConstr);
        add(searchField, searchConstr);
        add(typeBox, typeConstr);
        add(new JScrollPane(result), resultConstr);

        SearchAllLabels();
    }

    /**
     * Создает запрос на id и имя сущности
     * @param entity Сущность по которой осуществляется поиск
     * @param isInitial Следует указать true при создании модели таблицы и
     * инициализаци таблицы (в конструторе), в дальнейшем false, для включения
     * перерисовки
     */
    private void search()
    {
        currentType = (MusicEntity)typeBox.getSelectedItem();

        try
        {
            model.setRowSet(currentType.selectTitle(searchField.getText()));
            model.fireTableDataChanged();
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }

    private void SearchAllLabels()
    {
        currentType = (MusicEntity)typeBox.getSelectedItem();

        if (currentType.toString().equalsIgnoreCase("label"))
            try
            {
                explorer.createTab("All labels", currentType.selectAll());
            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            }
    }

    public void createTab()
    {
        int rowIndex = result.convertRowIndexToModel(result.getSelectedRow());

        try
        {
            explorer.createTab("123", currentType.select("" + model.getValueAt(rowIndex, 0)));
        }
        catch (SQLException ex)
        {
                ex.printStackTrace();
        }
    }

    private MusicEntity currentType;        //Сущность базы, по которой осуществляется поиск
    private ExplorePanel explorer;          //Панель браузера
    private SearchTableModel model;         //Модель данных таблицы
    private JTable result;                  //Таблица с результатами поиска
    private JTextField searchField;         //Поле с данными для поиска
    private JComboBox typeBox;              //Список для выбора сущности
    private JButton request;                //Кнопка запроса к базе
}
